iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Software Development

建構屬於自己的C/C++專案 : 我的30天CMake學習之旅系列 第 20

[Day 20] 使用第三方庫--以OpenCV為例

  • 分享至 

  • xImage
  •  

使用第三方函式庫 OpenCV 的範例

$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day20

  1. 解壓縮原始碼

$ unzip opencv.zip

  1. 編譯原始碼

$ cd opencv-4
$ mkdir build
$ cd build
$ cmake ..
$ make -j 4

make -j
這個參數的意思是使用幾核心進行編譯,因為opencv原始碼太複雜了,因此使用多核心編譯速度會比較快

這個時候可以選擇將 OpenCV 安裝至 PATH 的系統路徑中,也可以選擇指定 ${OpenCV_DIR} 的值,各有優缺點。

  • 安裝至系統路徑
    通常,穩定的第三方庫會推薦使用者安裝至系統路徑下,使用者直接使用find_package()就搞定了,但是如果安裝的文件名稱會衝突到其他庫,有可能會出現問題。
  • 直接指定 ${OpenCV_DIR} 路徑
    可以直接將 ${OpenCV_DIR} 路徑指定給剛剛編譯原始碼的 build 路徑,這樣就不用安裝任何檔案到系統中了,可以保持開發環境乾淨。

接下來的兩個範例就是分別使用這兩種方式來使用 OpenCV>。

直接指定 ${OpenCV_DIR} 路徑 範例

1. 編輯 CMakeLists.txt

為了要讓 find_package 找到 OpenCVConfig.cmake 這個設定檔,就要設定 ${OpenCV_DIR} 到 OpenCVConfig.cmake 所在資料夾。

kai@esoc:~/2023_iT_CMake/Day20/opencv-4.x/build$ tree -L 1
.
├── OpenCV-bf1094e-x86_64.sh
├── OpenCV-bf1094e-x86_64.tar.gz
├── OpenCV-bf1094e-x86_64.tar.Z
├── OpenCVConfig.cmake            <-----在這裡 ⭐
├── OpenCVConfig-version.cmake
└── version_string.tmp
set(OpenCV_DIR ${CMAKE_CURRENT_LIST_DIR}/../opencv-4.x/build)
# 設定 OpenCV_DIR 到 OpenCVConfig.cmake 所在資料夾
find_package(OpenCV REQUIRED)
# 尋找 OpenCV 這個第三方庫,REQUIRED 代表如果沒找到就會報錯

接下來,為了驗證find_package() 定義的變數,使用 message 印出內容

message(STATUS "OpenCV library status:")
message(STATUS "version: ${OpenCV_VERSION}")
message(STATUS "libraries: ${OpenCV_LIBS}")
message(STATUS "include path: ${OpenCV_INCLUDE_DIRS}")

最後,引入 OpenCV 的標頭檔,並將主程式與OpenCV的函式庫練接

include_directories(${OpenCV_INCLUDE_DIRS})
# 將 OpenCV 的 include 路徑加入到專案中
add_executable(main src/main.cpp)
# 將 main.cpp 編譯成可執行文件 main
target_link_libraries(main ${OpenCV_LIBS})
# 將 OpenCV 的 library 路徑加入到專案中

2. 編譯與執行主程式

$ cd build
$ cmake ..

這個時候,find_package 會顯示在哪個地方找到 OpenCV 的訊息。

kai@esoc:~/2023_iT_CMake/Day20/直接指定OpenCV_DIR路徑/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /home/kai/2023_iT_CMake/Day20/opencv-4.x/build (found version "4.8.0") <-----在這裡找到OpenCV ⭐
-- OpenCV library status:
-- version: 4.8.0

繼續編譯與執行

$ make
$ ./main ./../img/cmake_logo_icon.png

執行後就會顯示出以下圖片,就說明我們順利地使用 OpenCV 的函式庫了!
https://ithelp.ithome.com.tw/upload/images/20231004/20162026VT2KgzZVFe.png

3. 分析鍊結的路徑
可以發現,鍊結到的庫都是在 Day20/opencv-4.x/build 的各個資料夾下的庫,如果沒有 find_package 幫我們管理這些路徑,要使用大型的第三方庫是非常困難的一件事。

$ ldd main

kai@esoc:~/2023_iT_CMake/Day20/直接指定OpenCV_DIR路徑/build$ ldd main 
	linux-vdso.so.1 (0x00007ffe80d93000)
	libopencv_highgui.so.408 => /home/kai/2023_iT_CMake/Day20/opencv-4.x/build/lib/libopencv_highgui.so.408 (0x00007f60866a8000)
	libopencv_imgcodecs.so.408 => /home/kai/2023_iT_CMake/Day20/opencv-4.x/build/lib/libopencv_imgcodecs.so.408 (0x00007f6086637000)
	libopencv_core.so.408 => /home/kai/2023_iT_CMake/Day20/opencv-4.x/build/lib/libopencv_core.so.408 (0x00007f6085800000)

安裝至系統路徑 範例

1.進入 build 資料夾,將Config檔、頭文件、庫文件安裝至系統路徑內

$ cd /Day20/opencv-4.x/build
$ sudo make install

  1. 編輯 CMakeLists.txt**
    將上一個範例的 OpenCV_DIR 設定註解掉,因為 find_package 會去 ${PATH} 系統路徑中查找 Config 檔,因此不用設定。
# set(OpenCV_DIR ${CMAKE_CURRENT_LIST_DIR}/../opencv-4.x/build)
# 設定 OpenCV_DIR 到 OpenCVConfig.cmake 所在資料夾
find_package(OpenCV REQUIRED)
# 尋找 OpenCV 這個第三方庫,REQUIRED 代表如果沒找到就會報錯
  1. 編譯與執行

$ cd Day20/安裝至系統路徑/build
$ cmake ..

這個時候可以看到,find_package 在系統路徑 /usr/local 中找到 OpenCV 的設定檔。

kai@esoc:~/2023_iT_CMake/Day20/安裝至系統路徑/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.8.0")  <-----在這裡找到OpenCV ⭐
-- OpenCV library status:
-- version: 4.8.0
kai@esoc:/usr/local/lib/cmake/opencv4$ tree
.
├── OpenCVConfig.cmake        <-----Config檔在這裡 ⭐
├── OpenCVConfig-version.cmake
├── OpenCVModules.cmake
└── OpenCVModules-release.cmake

繼續編譯與執行

$ make
$ ./main ./../img/cmake_logo_icon.png

3. 分析鍊結的路徑
可以發現,鍊結到的庫都是在系統路徑下。

$ ldd main

kai@esoc:~/2023_iT_CMake/Day20/安裝至系統路徑/build$ ldd main 
	linux-vdso.so.1 (0x00007fff4a491000)
	libopencv_highgui.so.408 => /usr/local/lib/libopencv_highgui.so.408 (0x00007fb30532a000)
	libopencv_imgcodecs.so.408 => /usr/local/lib/libopencv_imgcodecs.so.408 (0x00007fb3052b9000)
	libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0x00007fb304400000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb304000000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb305275000)

Reference

OpenCV: Installation in Linux


上一篇
[Day 19] 使用第三方庫
下一篇
[Day 21] 使用第三方庫--以json為例
系列文
建構屬於自己的C/C++專案 : 我的30天CMake學習之旅29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言